Gremlinの攻撃の状態をNew Relicに送信する
GremlinにはWebhookの機能があり、攻撃の実行時にカスタムHTTPエンドポイントを呼び出すことができます。 攻撃の状態を監視サービスやインシデント管理サービスに送信することにより、攻撃をシステムの動作の変化と相関させることができます。 これによりカオス実験中に観察された問題にすばやく対処していくことが可能になっていきます。
今回は監視サービスにNew Relicを用いてGremlinからデータを送信してみます。 New Relicにはカスタムイベントデータを送信できるAPIがありますので、それを使います。
New Relic: Report custom event data
必要なもの
- Gremlinのアカウント(FreeトライアルでOK)
- New Relicのアカウント(FreeトライアルでOK)
- EC2インスタンス
- New Relic Infrastructureをインストールしている
- Gremlin Agentをインストールしている
New RelicでEC2のメトリクスが可視化できている状態にしておきます。
New Relic
Insert Keysの生成
カスタムイベントデータを送信するために Insert Keys というAPI Keyを作成します。
ダッシュボードにログインし、Insights
のぺーじに遷移しましょう。
左メニューの Manage data
をクリックし、そのページのInsert Keys +
をクリックします。
Keyが生成されるのでSaveします。
動作確認
keyの生成画面にcURLコマンドが表示されているので、そのコマンドを実行してデータが送信されるか、送信したデータが参照できるか確認します。
$ wget https://insights.newrelic.com/example_events.json $ gzip -c example_events.json | curl --data-binary @- -X POST -H "Content-Type: application/json" -H "X-Insert-Key: <your key>" -H "Content-Encoding: gzip" https://insights-collector.newrelic.com/v1/accounts/2797057/events
※ example_events.jsonのなかみ
[ { "eventType": "Purchase", "account": 3, "amount": 259.54 }, { "eventType": "Purchase", "account": 5, "amount": 12309, "product": "Item" } ]
実行後、
{"success":true, "uuid":"bb6588e6-003a-b000-0000-01739473fe46"}
という結果が返って来ればリクエストは成功です。
データを参照するには、InsightsでNRQLを実行します。
eventType
にPurchase
と指定してデータを送信したので、クエリは
SELECT * FROM Purchase
となります。
上記画像のようにきちんとデータが表示できているか確認します。
Gremlin
Webhookを設定していきます。Webhookはチーム単位で設定します。
ダッシュボードにログインし、右上の方にある人のマークからTeam Settings
をクリックします.
Webhook
タブをクリックし、New Webhook
を押して作っていきます。
設定項目 | 説明 |
---|---|
Name | Webhookの名前 |
Description | Webhookの説明 |
Request URL | Newrelic の APIエンドポイント (https://insights-collector.newrelic.com/v1/accounts/ |
Custom Headers | Key: X-Insert-Key , Value: New Relicで生成したInsert Keys |
Request Method | POST |
Events | Webhookが実行されるトリガーとなるイベントを選択 |
Active | チェックがついているとWebhookが有効になります |
Payload | New Relicに送信するjson形式の情報 |
PayloadにはeventType
を必ず設定します。例えば、
{ "eventType":"GremlinAttack", "teamId": "${TEAM_ID}", "attackId": "${ATTACK_ID}", "attackType": "${ATTACK_TYPE}", "attackStatus": "${STATUS}", "finalStage": "${STAGE}", "source": "${SOURCE}", "time": "${TIME}" }
Webhookの出力形式は、統合するツールの必要な入力形式と一致するようにトークンを使用してカスタマイズできます。 リクエストで提供される情報には、次のものが含まれます。
デフォルトのキー | 説明 | トークン |
---|---|---|
teamId | 攻撃を実行したチームの一意のチーム識別子。 | ${TEAM_ID} |
attackId | 攻撃の一意の識別子。 | ${ATTACK_ID} |
attackType | グレムリン攻撃タイプ。 | ${ATTACK_TYPE} |
stage | 攻撃によって実現した最も遠いステージ。 | ${STAGE} |
attackStatus | 要求のトリガーイベント(初期化、実行中、終了)。 | ${STATUS} |
source | 攻撃のソース(API、手動、スケジュール、Spinnaker、WebApp)。 | ${SOURCE} |
time | トリガーされたイベントのタイムスタンプ。 | ${TIME} |
全て入力し終えたらSave
を押して完了です。
攻撃を実行して攻撃の状態を確認する
実行
設定が終わったので、実際に攻撃してNew Relicでデータを参照できるか確認します。 本記事ではCPU攻撃を仕掛けてみます。
Gremlinの左メニューからAttacks
を選択し、攻撃するホストを選択します。
Category: Resource, Attacks: CPUにします。 全てのコアを120秒間攻撃し、CPUリソースを80%に設定します。
設定が終わったら、Unleash Gremlin
を押して解き放ちます。
実行時の画面です。
実験終了後の画面です。CPU使用率が元に戻って行っていることがわかります。
New RelicのHost情報を見ても、80%までゲキ上がりしていることがわかります。
Webhookの確認
WebhookからNew Relicにデータを送信する設定を行いました。 実験が終わったので送信されたデータを参照できるか確認してみます.
New RelicのInsightsの画面に行き、以下のクエリを実行します。
SELECT * FROM GremlinAttack
GremlinAttackというのは、Webhookの設定時にPayloadに指定したeventType
です。
実験の結果が取得できましたっ。
クエリから得られた情報をダッシュボードに追加することも可能です。 毎回確認するより、常に表示させておいた方が良いと思います。
NRQLを使って折れ線グラフにすることも可能です。
SELECT uniqueCount(attackStatus) from GremlinAttack FACET attackStatus SINCE 1 hour ago TIMESERIES 1 minute
作成したグラフで攻撃の開始と終了、CPU使用率グラフで増加したCPU負荷を確認することが可能です。
GremlinのWebhookを使い他のシステムと統合することにより、様々な洞察を得ることができます。 例えば、過去のインシデントを再現し、監視ツールを使用して問題を突き止めたりすることに利用したり、まだ経験していない事象を発見したりとか。 Gremlinと監視サービスを使い、適切なメトリクスを収集、サービスの健全性を可視化し、SLOを満たしていることを確認できるようにしていくことが重要ではないでしょうか。